'use strict';
// {app_root}/app/model/user.js
//用于md5加密
var bcrypt = require('bcryptjs')
//加盐数
var SALT_WORK_FACTOR = 10

module.exports = app => {
  const mongoose = app.mongoose;
  const Schema = mongoose.Schema;

  // const UserSchema = new Schema({
  //   userName: { type: String },
  //   password: { type: String },
  // });

  const UserSchema = new Schema({
    tel: {
      unique:true,
      type: String
    },
    name: {
      type: String,
      default:""
    },
    password:{
      type:String,
      required:true
    },
    avatar: String,
    gender:{
      type:Number,
      default:0  //0 未知  1 男， 2 女 
    },
    level:{
      type:Number,
      default:1  //1 普通用户， 2 vip 用户， 3 超级vip用户
    },
    type:{
      type:Number,
      default:1   //1 用户 ， 2 运营账户，3 运营子账户， 4 后台管理账户  
    },
    state:{
      type:Number,
      default:0    // 0 正常用户 ， 1-n 有几次违规， 每次违规 加一 
    }

  },  { timestamps: true });
  //对密码进行加密,保存前的装饰器
  UserSchema.pre('save', function (next) {
    var user = this
    if (this.isNew) {
      this.createAt = this.updateAt = Date.now()
    }
    else {
      this.updateAt = Date.now()
    }
    bcrypt.genSalt(SALT_WORK_FACTOR, function (err, salt) {
      if (err) return next(err)
  
      bcrypt.hash(user.password, salt, function (err, hash) {
        if (err) return next(err)
  
        user.password = hash
        next()
      })
    })
  })
  //用于比较密码是否正确，，methods给实例绑定方法
  UserSchema.methods = {
    comparePassword: function (_password, cb) {
      bcrypt.compare(_password, this.password, function (err, isMatch) {
        if (err) return cb(err)
        cb(null, isMatch)
      })
    },
    comparePasswordPromise:function(_password){
      var me = this;
      return new Promise(function(resolve,reject){
        bcrypt.compare(_password, me.password, function (err, isMatch) {
          if (err) return reject(err);
           resolve(isMatch); 
        })
      });
    }
  }
  
  //statics 给类绑定方法 ==>后面用到的User
  UserSchema.statics = {
    fetch: function (cb) {
      return this
        .find({})
        .sort('meta.updateAt')
        .exec(cb)
    },
    findById: function (id, cb) {
      return this
        .findOne({_id: id})
        .exec(cb)
    }
  }

  return mongoose.model('User', UserSchema);
};
